package com.tarena.sentinel.demo02.controller;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.tarena.sentinel.demo02.handler.block.GlobalBlockHandler;
import com.tarena.sentinel.demo02.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    HelloService service;

    @GetMapping("/hello")
    // @SentinelResource注解定义资源,
    // value-资源名称
    // blockHandler-指定方法名称,当达到预设的规则则执行该方法内容
    // blockHandlerClass - 指定流控方法所在的类,实现流控处理逻辑与资源方法完全分离
//    @SentinelResource(
//            value = "resource01",
//            blockHandler = "blockExceptionHandler",
//            blockHandlerClass = GlobalBlockHandler.class)
    public String sayHi(String name){

        long start = System.currentTimeMillis();
        String result = service.sayHi(name);
        long end = System.currentTimeMillis();
        System.out.println("调用sayHi方法的时间间隔:"+(end-start)+"ms");

        return result;
//        Entry entry = null;
//        String result = "";
//        try {
//            // entry入口对象,对sentinel资源的一次访问
//            entry = SphU.entry("resource01");
//            result = service.sayHi(name);
//        } catch (BlockException e) {
//            // 如果抛出异常,证明本次请求,超出了流量控制上限
//            // 流控规则被触发,请求被拒绝(降级逻辑在此位置编写)
//            return "你的请求被流量拦截了!";
//        } finally {
//            // 释放资源
//            if(entry!=null){
//                entry.exit();
//            }
//        }
    }

    // 此位置为catch逻辑
    // 方法名称与@SentinelResource中blockHandler属性一致
    // 返回值与@SentinelResource修饰的方法一致
    // 参数列表与@SentinelResource修饰的方法一致,同时需要再额外添加BlockException类型参数
//    public String blockExceptionHandler(String name,BlockException e){
//        return "你的请求被流量拦截了!";
//    }

    @SentinelResource(value = "resource03")
    public String sayBye(String name){
        //service.sayHi(name);
        return "hello ["+name+"],sentinel welcome";
    }



}
